package com.study.hospital_3.service;

import com.study.hospital_3.mapper.UserMapper;
import com.study.hospital_3.pojo.User;
import com.study.hospital_3.vo.UserUpdateVO;
import com.study.hospital_3.vo.UserVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

    @Service
    public class UserService {

        @Resource
        private UserMapper userMapper;

        // 查询用户表
        public Map<String, Object> selectUsers(UserVO userVO) {
            System.out.println("--------------------------------------------------------------------");
            System.out.println(userVO.getPage());
            System.out.println(userVO.getLimit());
            System.out.println(userVO.getUsername());
            System.out.println(userVO.getId());
            System.out.println("--------------------------------------------------------------------");
            Map<String, Object> map = new HashMap<>();
            map.put("code", 0);
            map.put("msg", "查询用户列表成功");
            /* 注意，如果需要实现这里ifelse的功能需另外再写一个不要limit的搜索专用查询返回count */
            /* 分页功能的基于传递limit和page参数限制数据查询返回数量实现，但需要将真实的数据总数赋给count */
            // 对于分页功能的实现，在没有使用搜索的情况下，返回的数据项个数为全表
//            if(userVO.getId() == null && userVO.getUsername() == null && userVO.getRealname() == null)
                map.put("count", userMapper.count());
            // 使用搜索的情况下，返回的数据项个数为搜索后返回的匹配数据项
//            else
//                map.put("count", userMapper.selectUsers(userVO).size());
            map.put("data", userMapper.selectUsers(userVO));
            return map;
        }

        // 新增用户
        public Map<String, Object> insert(UserVO UserVO) {
            User user = new User();
            BeanUtils.copyProperties(UserVO, user);   // 把前端传递的值对象数据，自动封装到pojo对象中去(反射机制)

            // 手动修改用户密码为md5值
            String md5 = DigestUtils.md5DigestAsHex(user.getPassword().getBytes(StandardCharsets.UTF_8));
            user.setPassword(md5);

            userMapper.insert(user);
            Map<String, Object> map = new HashMap<>();
            map.put("code", 200);
            map.put("msg", "新增用户成功");
            map.put("data", user);
            return map;
        }

        // 登录验证
        public Map<String, Object> login(UserVO UserVO) {
            // 将vo对象的值转到pojo对象中去
            User user = new User();
            BeanUtils.copyProperties(UserVO, user);

            // 调用mapper中的返回值 封装JSON格式的map
            user = userMapper.login(user);
            Map<String, Object> map = new HashMap<>();

            // 用户名是否存在
            if (userMapper.login(user) == null) {
                map.put("code", 65001);
                map.put("msg", "用户名或密码错误！");
            }
            // 用户名存在后匹配密码是否正确
            else{
                // 将输入的密码明文进行md5处理
                String md5s = DigestUtils.md5DigestAsHex(UserVO.getPassword().getBytes());
                UserVO.setPassword(md5s);     // 将md5值set进pojo对象

                // 对比输入(vo)的密码和数据库中的密码
                String sql_pwd = DigestUtils.md5DigestAsHex(user.getPassword().getBytes(StandardCharsets.UTF_8));
                String user_pwd = DigestUtils.md5DigestAsHex(UserVO.getPassword().getBytes(StandardCharsets.UTF_8));
                if (sql_pwd.equals(user_pwd)) {     // 密码匹配
                    map.put("code", 200);
                    map.put("msg", "登陆成功");
                    map.put("username", user.getUsername());
                    map.put("id", user.getId());
                }
                else{      // 密码不匹配
                    map.put("code", 65002);
                    map.put("msg", "用户名或密码错误！");
                }
            }
            return map;
        }
        
        
        /**
         * 根据指定的主键id删除一个用户记录
         * @param id  用户的主键id
         * @return    返回删除的状态和信息
         */
        public Map<String, Object> deleteById(Integer id) {
            Map<String, Object> map = new HashMap<>();
            userMapper.deleteById(id);
            map.put("code", 200);
            map.put("msg", "删除用户成功");
            return map;
        }

        public Map<String, Object> updateById(UserUpdateVO userUpdateVO) {
            Map<String, Object> map = new HashMap<>();
            userMapper.updateById(userUpdateVO);
            map.put("code", 200);
            map.put("msg", "更新用户成功");
            return map;
        }

        public Map<String, Object> selectById(Integer id) {
            Map<String, Object> map = new HashMap<>();
            map.put("code", 200);
            map.put("msg", "SUCCESS");
            map.put("data", userMapper.selectById(id));
            return map;
        }

    }


